Codage des
nombres réels
I Conversion d’un nombre réel exprimé en base B à virgule fixe en décimal (base 10)
1)
Principe
Soit N un nombre réel positif exprimé
en base B, il se compose ainsi :
(N)B = an an-1 ... a1 a0 , b1 b2 ... bm-1 bm
Sa valeur en décimal est
alors donnée par le calcul de :
anBn + an-1 Bn-1 + ... a1B + a0 +b1B-1 + b2B-2 + ... bm-1 B-m+1 + bmB-m
2) Exemples :
En base 10 on a 123,45 = 1 × 102 + 2 × 101 + 3 ×100 + 4 ×10-1 + 5 ×10-2
De même (101,101)2 = 1×22 + 0 ×21 + 1 ×20 + 1 ×2-1+ 0× 2-2 + 1 × 2-3= 4 + 1 + 0,5 + 0,125
=5,625
De même (AB,4E)16 = 10× 161 + 11 ×160 + 4 ×16-1 + 14 ×16-2
= 160
+ 11 + 4× 0,0625 + 14 ×0,00390625
= 171,3046875
II Méthode
de conversion d'un nombre décimal réel en base B (virgule fixe)
Pour la partie entière ·
Utiliser par exemple la
méthode des divisions entières successives Pour la partie « fractionnaire » à droite de la virgule
(Car on ne peut pas toujours obtenir une conversion en un
nombre fini de chiffres pour la partie fractionnaire)
|
Exemple coder 0,375 puis 0,3 et enfin 5,375 en
binaire
0,375×2 = 0,75 0,75×2 = 1,5 0,5×2 = 1,0 Donc 0,375 = (0,011)2 |
0.3×2=0.6 0.6×2=1.2 0.2×2=0.4 0.4×2=0.8 0.8×2=1.6 0.6×2=1.2 … 0,3 ≈
0,010011001 à 2-9
près |
Remarque :
0,3 comme de très nombreux réels ne
pourra pas être codé de façon exacte sur un nombre fini d’octets.
Conséquences :
en programmation (python
par exemple). Il ne faudra jamais tester une égalité de réels, mais seulement
tester si la différence de deux réels est inférieure à un seuil.
Illustration en python :
0.2+0.1==0.3 >>>False |
Par contre : 0.2+0.1-0.3<10-15 >>>True |
III Le codage des réels
en binaire à virgule flottante(float)
1)
Le
principe
Il a pour but de traiter le codage de la
virgule et il est inspiré de la notation scientifique en base 10.
715,25=7,1525×10² : notation scientifique
0,00078=7,8×10-4
De même : 11110,1112=1,11101112×2410
Ou encore 0,111=1,11×2-110
De façon générale 1 sera le seul chiffre
avant la virgule et une puissance de 2 indiquera le décalage de la virgule.
2)
Un
exemple de codage d’un nombre réel par caractéristique et mantisse sur deux
octets
Ainsi en codant uniquement l’exposant et l’ensemble des chiffres de la partie inférieure à 2, que l’on
nommera mantisse, on pourra de façon économique coder de
grands nombres ou de très petits.
Il est proposé
ici un codage binaire sur 2 octets, où les
8 premiers bits à gauche (en vert souligné)
coderont l’exposant nommé caractéristique, (en CA2 pour les négatifs) et
les 8 autres bits coderont la mantisse. Ce codage est créé à titre pédagogique, mais
n’est pas une norme en vigueur.
XXXXXXXXXXXXXXXX
Caractéristique mantisse
Exposant chiffres
Exemples :
410=000001002
0000010011110111
sera le codage de 30,87510
310=000000112
11111100
11111101ca2= -3
1111110111000000 sera le codage de 0,187510.
La mantisse à été complétée à droite par
des 0.
IV POUR ALLER PLUS LOIN
(NON EXIGIBLE)
L’exemple de codage du III2) n’est pas une norme
actuellement utilisée en machine, mais les normes en vigueur comme IEEE754 reposent sur les mêmes
principes tout en apportant des améliorations techniques.
Le codage machine : codage des réels en virgule flottante : la norme IEEE 754 sur 32
bits.
La norme IEEE 754 (reprise par la norme
internationale CEI 60559)
spécifie deux formats de nombres en virgule flottante (et deux formats étendus
optionnels) et les opérations associées. La quasi-totalité des architectures
d'ordinateurs actuelles, y compris IA32, PowerPC, et AMD64,
incluent une implémentation matérielle des calculs sur flottants IEEE,
directement dans le microprocesseur, garantissant une exécution rapide. Les
deux formats fixés par la norme IEEE 754 sont sur 32 bits
(« simple précision ») et 64 bits (« double précision »).
La répartition des bits est
la suivante, où 1 ≤ M < 2 :
|
Encodage |
Signe |
Exposant E |
Mantisse M |
Valeur d'un nombre |
Précision |
Chiffres significatifs |
Simple précision |
32 bits |
1 bit |
8 bits |
23 bits |
(-1)s×M×2(E-127) |
24 bits |
7 |
Double précision |
64 bits |
1 bit |
11 bits |
52 bits |
(-1)s×M×2(E-1023) |
53 bits |
16 |
Le tableau ci-dessus indique les bits représentés. Le premier bit de la mantisse d'un nombre normalisé étant toujours 1, il n'est représenté dans aucun de ces deux formats : on parle de bit implicite. Pour ces deux formats, les précisions sont donc respectivement de 24 et de 53 bits.
Nous allons voir dans cette partie comment
appliquer la norme 754 d'abord d'un nombre décimal a
un nombre binaire, puis d'un nombre
binaire a un nombre décimal. (Nous n’aborderons que le cas des nombres
normalisés)
1 - Comment appliquer la norme IEEE754 sur le nombre 238,4375
· La représentation binaire de 238 est : 1110 1110 · La représentation binaire de 0,4375 est
0,0111 = 0*1/2 + 1*1/4 +
1*1/8+ 1*1/16 Dès lors, la
représentation binaire de 238,4375 est : 1110
1110,0 111. En normalisant de façon à avoir un seul 1 avant la
virgule, on obtient : 1, 110 1110 0111 * 27 (ici nous
déplaçons la virgule de 7 rangs) ATTENTION nous sommes
en binaire : 10 en binaire s'écrit 2 en décimale · L'exposant
dans notre cas est 7, codé avec la norme nous allons avoir 7 + 127 = 134 et en binaire 1000 0 110. · Le nombre est positif donc s = 0. Nous obtenons alors : 01000011011011100111000000000000. La mantisse étant complétée par des zéros à
droite. Nous avons bien : (- 1)0 * 2(10000110 - 0111 1111) * (1, 110 1110 0111) |
2- Que vaut : 11000111000000001100010100001000 codé selon
la norme 754?
·
Première
lecture : (- 1)1 * 2(10001110 - 0111 1111) * (1, 0000 0001 1000 1010 0001) ·
Le
signe : 1 donc négatif ·
L'exposant
: 10001110 - 01111111 = 1111 => 15 (décimale) ·
La
mantisse : 1,0000 0001 1000
1010 0001 (d'où sort ce 1
? c'est la norme qui nous le donne par définition. Le nombre en binaire
sera : -1 * 2(15) * (1,0000 0001
1000 1010 0001), ce qui donne : 1000 0000
1100 0101,0000 1 (en binaire ). Ici nous déplaçons
la virgule de 15 rangs. 1000 0000 1100 0101 est converti en décimal par 32
965 (0,00001 est converti en décimal par 1/32 = 0,03125). En décimale nous
avons donc : - 32 965, 03125 |
Se posent encore les cas du 0 et des
nombres non normalisés qui font l’objet de convention d’écriture et de codage
particulières.